/*
 * Copyright 2012 Objectos, Fábrica de Software LTDA.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package br.com.objectos.way.cnab;

import java.util.Map;

/**
 * @author marcio.endo@objectos.com.br (Marcio Endo)
 */
class BradescoOcorrenciaParser extends OcorrenciaParser {

  private static final Map<String, OcorrenciaCodigoPadrao> codigoMap = new Wrapper()
      .codigo(2, "Entrada Confirmada")
      .motivosAt(318, 328)
      .ignorarExtras("00")
      .add("00", "Ocorrência aceita")
      .add("01", "Código do Banco inválido")
      .add("04", "Código do movimento não permitido para a carteira")
      .add("15", "Características da cobrança incompatíveis")
      .add("17", "Data de vencimento anterior a data de emissão")
      .add("21", "Espécie do Título inválido")
      .add("24", "Data da emissão inválida")
      .add("27", "Valor/taxa de juros mora inválido")
      .add("38", "Prazo para protesto inválido")
      .add("39", "Pedido para protesto não permitido para título")
      .add("43", "Prazo para baixa e devolução inválido")
      .add("45", "Nome do Sacado inválido")
      .add("46", "Tipo/num. de inscrição do Sacado inválidos")
      .add("47", "Endereço do Sacado não informado")
      .add("48", "CEP Inválido")
      .add("50", "CEP referente a Banco correspondente")
      .add("53", "No de inscrição do Sacador/avalista inválidos (CPF/CNPJ)")
      .add("54", "Sacador/avalista não informado")
      .add("67", "Débito automático agendado")
      .add("68", "Débito não agendado - erro nos dados de remessa")
      .add("69", "Débito não agendado - Sacado não consta no cadastro de autorizante")
      .add("70", "Débito não agendado - Cedente não autorizado pelo Sacado")
      .add("71", "Débito não agendado - Cedente não participa da modalidade de déb.automático")
      .add("72", "Débito não agendado - Código de moeda diferente de R$")
      .add("73", "Débito não agendado - Data de vencimento inválida/vencida")
      .add("75", "Débito não agendado - Tipo do número de inscrição do sacado debitado inválido")
      .add("76", "Sacado Eletrônico DDA (NOVO)")
      .add("86", "Seu número do documento inválido")
      .add("89", "Email Sacado não enviado – título com débito automático")
      .add("90", "Email sacado não enviado – título de cobrança sem registro")
      .put()

      .codigo(3, "Entrada Rejeitada")
      .motivosAt(318, 328)
      .add("02", "Código do registro detalhe inválido")
      .add("03", "Código da ocorrência inválida")
      .add("04", "Código de ocorrência não permitida para a carteira")
      .add("05", "Código de ocorrência não numérico")
      .add("07", "Agência/conta/Digito - |Inválido")
      .add("08", "Nosso número inválido")
      .add("09", "Nosso número duplicado")
      .add("10", "Carteira inválida")
      .add("13", "Identificação da emissão do bloqueto inválida")
      .add("16", "Data de vencimento inválida")
      .add("18", "Vencimento fora do prazo de operação")
      .add("20", "Valor do Título inválido")
      .add("21", "Espécie do Título inválida")
      .add("22", "Espécie não permitida para a carteira")
      .add("24", "Data de emissão inválida")
      .add("28", "Código do desconto inválido")
      .add("38", "Prazo para protesto inválido")
      .add("44", "Agência Cedente não prevista")
      .add("45", "Nome do sacado não informado")
      .add("46", "Tipo/número de inscrição do sacado inválidos")
      .add("47", "Endereço do sacado não informado")
      .add("48", "CEP Inválido")
      .add("50", "CEP irregular - Banco Correspondente")
      .add("63", "Entrada para Título já cadastrado")
      .add("65", "Limite excedido")
      .add("66", "Número autorização inexistente")
      .add("68", "Débito não agendado - erro nos dados de remessa")
      .add("69", "Débito não agendado - Sacado não consta no cadastro de autorizante")
      .add("70", "Débito não agendado - Cedente não autorizado pelo Sacado")
      .add("71", "Débito não agendado - Cedente não participa do débito Automático")
      .add("72", "Débito não agendado - Código de moeda diferente de R$")
      .add("73", "Débito não agendado - Data de vencimento inválida")
      .add("74", "Débito não agendado - Conforme seu pedido, Título não registrado")
      .add("75", "Débito não agendado – Tipo de número de inscrição do debitado inválido")
      .put()

      .codigo(6, "Liquidação normal")
      .semMotivo()

      .codigo(9, "Baixado Automat. via Arquivo")
      .motivosAt(318, 328)
      .ignorarExtras("00")
      .add("00", "Ocorrência Aceita")
      .add("10", "Baixa Comandada pelo cliente")
      .put()

      .codigo(10, "Baixado conforme instruções da Agência")
      .motivosAt(318, 328)
      .ignorarExtras("00")
      .add("00", "Baixado Conforme Instruções da Agência")
      .add("14", "Título Protestado")
      .add("15", "Título excluído")
      .add("16", "Título Baixado pelo Banco por decurso Prazo")
      .add("20", "Título Baixado e transferido para desconto")
      .put()

      .codigo(11, "Em Ser - Arquivo de Títulos pendentes")
      .semMotivo()

      .codigo(12, "Abatimento Concedido")
      .semMotivo()

      .codigo(13, "Abatimento Cancelado")
      .semMotivo()

      .codigo(14, "Vencimento Alterado")
      .semMotivo()

      .codigo(15, "Liquidação em Cartório")
      .semMotivo()

      .codigo(16, "Título Pago em Cheque – Vinculado")
      // verificar motivos
      .semMotivo()

      .codigo(17, "Liquidação após baixa ou Título não registrado")
      .semMotivo()

      .codigo(18, "Acerto de Depositária")
      .semMotivo()

      .codigo(19, "Confirmação Receb. Inst. de Protesto")
      .motivosAt(294, 295)
      .put()

      .codigo(20, "Confirmação Recebimento Instrução Sustação de Protesto")
      .semMotivo()

      .codigo(21, "Acerto do Controle do Participante")
      .semMotivo()

      .codigo(22, "Título Com Pagamento Cancelado")
      // verificar motivos
      .semMotivo()

      .codigo(23, "Entrada do Título em Cartório")
      .semMotivo()

      .codigo(24, "Entrada rejeitada por CEP Irregular")
      .motivosAt(318, 328)
      .add("48", "CEP inválido")
      .put()

      .codigo(25, "Confirmação Receb.Inst.de Protesto Falimentar")
      .motivosAt(294, 295)
      .put()

      .codigo(27, "Baixa Rejeitada")
      .motivosAt(318, 328)
      .add("04", "Código de ocorrência não permitido para a carteira")
      .add("07", "Agência/Conta/dígito inválidos")
      .add("08", "Nosso número inválido")
      .add("10", "Carteira inválida")
      .add("15", "Carteira/Agência/Conta/nosso número inválidos")
      .add("40", "Título com ordem de protesto emitido")
      .add("42", "Código para baixa/devolução via Telebradesco inválido")
      .add("60", "Movimento para Título não cadastrado")
      .add("77", "Transferência para desconto não permitido para a carteira")
      .add("85", "Título com pagamento vinculado")
      .put()

      .codigo(28, "Débito de tarifas/custas")
      .motivosAt(318, 328)
      .add("02", "Tarifa de permanência título cadastrado")
      .add("03", "Tarifa de sustação")
      .add("04", "Tarifa de protesto")
      .add("05", "Tarifa de outras instruções")
      .add("06", "Tarifa de outras ocorrências")
      .add(MotivoBradescoCustas.of("08", "Custas de protesto"))
      .add("12", "Tarifa de registro")
      .add("13", "Tarifa título pago no Bradesco")
      .add("14", "Tarifa título pago compensação")
      .add("15", "Tarifa título baixado não pago")
      .add("16", "Tarifa alteração de vencimento")
      .add("17", "Tarifa concessão abatimento")
      .add("18", "Tarifa cancelamento de abatimento")
      .add("19", "Tarifa concessão desconto")
      .add("20", "Tarifa cancelamento desconto")
      .add("21", "Tarifa título pago cics")
      .add("22", "Tarifa título pago Internet")
      .add("23", "Tarifa título pago term. gerencial serviços")
      .add("24", "Tarifa título pago Pág-Contas")
      .add("25", "Tarifa título pago Fone Fácil")
      .add("26", "Tarifa título Déb. Postagem")
      .add("27", "Tarifa impressão de títulos pendentes")
      .add("28", "Tarifa título pago BDN")
      .add("29", "Tarifa título pago Term. Multi Função")
      .add("30", "Impressão de títulos baixados")
      .add("31", "Impressão de títulos pagos")
      .add("32", "Tarifa título pago Pagfor")
      .add("33", "Tarifa reg/pgto – guichê caixa")
      .add("34", "Tarifa título pago retaguarda")
      .add("35", "Tarifa título pago Subcentro")
      .add("36", "Tarifa título pago Cartão de Crédito")
      .add("37", "Tarifa título pago Comp Eletrônica")
      .add("38", "Tarifa título Baix. Pg. Cartório")
      .add("39", "Tarifa título baixado acerto BCO")
      .add("40", "Baixa registro em duplicidade")
      .add("41", "Tarifa título baixado decurso prazo")
      .add("42", "Tarifa título baixado Judicialmente")
      .add("43", "Tarifa título baixado via remessa")
      .add("44", "Tarifa título baixado rastreamento")
      .add("45", "Tarifa título baixado conf. Pedido")
      .add("46", "Tarifa título baixado protestado")
      .add("47", "Tarifa título baixado p/ devolução")
      .add("48", "Tarifa título baixado franco pagto")
      .add("49", "Tarifa título baixado SUST/RET/CARTÓRIO")
      .add("50", "Tarifa título baixado SUS/SEM/REM/CARTÓRIO")
      .add("51", "Tarifa título transferido desconto")
      .add("52", "Cobrado baixa manual")
      .add("53", "Baixa por acerto cliente")
      .add("54", "Tarifa baixa por contabilidade")
      .add("55", "BIFAX")
      .add("56", "Consulta informações via internet(Novo)")
      .add("57", "Arquivo retorno via internet")
      .add("58", "Tarifa emissão Papeleta")
      .add("59", "Tarifa fornec papeleta semi preenchida")
      .add("60", "Acondicionador de papeletas (RPB)S")
      .add("61", "Acond. De papelatas (RPB)s PERSONAL")
      .add("62", "Papeleta formulário branco")
      .add("63", "Formulário A4 serrilhado")
      .add("64", "Fornecimento de softwares transmiss")
      .add("65", "Fornecimento de softwares consulta")
      .add("66", "Fornecimento Micro Completo")
      .add("67", "Fornecimento MODEN")
      .add("68", "Fornecimento de máquina FAX")
      .add("69", "Fornecimento de máquinas óticas")
      .add("70", "Fornecimento de Impressoras")
      .add("71", "Reativação de título")
      .add("72", "Alteração de produto negociado")
      .add("73", "Tarifa emissão de contra recibo")
      .add("74", "Tarifa emissão 2a via papeleta")
      .add("75", "Tarifa regravação arquivo retorno")
      .add("76", "Arq. Títulos a vencer mensal")
      .add("77", "Listagem auxiliar de crédito")
      .add("78", "Tarifa cadastro cartela instrução permanente")
      .add("79", "Canalização de Crédito")
      .add("80", "Cadastro de Mensagem Fixa")
      .add("81", "Tarifa reapresentação automática título")
      .add("82", "Tarifa registro título déb. Automático")
      .add("83", "Tarifa Rateio de Crédito")
      .add("84", "Emissão papeleta sem valor")
      .add("85", "Sem uso")
      .add("86", "Cadastro de reembolso de diferença")
      .add("87", "Relatório fluxo de pagto")
      .add("88", "Emissão Extrato mov. Carteira")
      .add("89", "Mensagem campo local de pagto")
      .add("90", "Cadastro Concessionária serv. Publ.")
      .add("91", "Classif. Extrato Conta Corrente")
      .add("92", "Contabilidade especial")
      .add("93", "Realimentação pagto")
      .add("94", "Repasse de Créditos")
      .add("95", "Tarifa reg. pagto Banco Postal")
      .add("96", "Tarifa reg. Pagto outras mídias")
      .add("97", "Tarifa Reg/Pagto – Net Empresa")
      .add("98", "Tarifa título pago vencido")
      .add("99", "TR Tít. Baixado por decurso prazo")
      .add("100", "Arquivo Retorno Antecipado")
      .add("101", "Arq retorno Hora/Hora")
      .add("102", "TR. Agendamento Déb Aut")
      .add("103", "TR. Tentativa cons Déb Aut")
      .add("104", "TR Crédito on-line")
      .add("105", "TR. Agendamento rat. Crédito")
      .add("106", "TR Emissão aviso rateio")
      .add("107", "Extrato de protesto")
      .add("110", "Tarifa reg/pagto Bradesco Expresso")
      .put()

      .codigo(29, "Ocorrências do Sacado (NOVO)")
      .motivosAt(318, 328)
      .add("78", "Sacado alega que faturamento e indevido")
      .add("116", "Sacado aceita/reconhece o faturamento")
      .put()

      .codigo(30, "Alteração de Outros Dados Rejeitados")
      .motivosAt(318, 328)
      .add("01", "Código do Banco inválido")
      .add("04", "Código de ocorrência não permitido para a carteira")
      .add("05", "Código da ocorrência não numérico")
      .add("08", "Nosso número inválido")
      .add("15", "Característica da cobrança incompatível")
      .add("16", "Data de vencimento inválido")
      .add("17", "Data de vencimento anterior a data de emissão")
      .add("18", "Vencimento fora do prazo de operação")
      .add("24", "Data de emissão Inválida")
      .add("26", "Código de juros de mora inválido")
      .add("27", "Valor/taxa de juros de mora inválido")
      .add("28", "Código de desconto inválido")
      .add("29", "Valor do desconto maior/igual ao valor do Título")
      .add("30", "Desconto a conceder não confere")
      .add("31", "Concessão de desconto já existente ( Desconto anterior )")
      .add("32", "Valor do IOF inválido")
      .add("33", "Valor do abatimento inválido")
      .add("34", "Valor do abatimento maior/igual ao valor do Título")
      .add("38", "Prazo para protesto inválido")
      .add("39", "Pedido de protesto não permitido para o Título")
      .add("40", "Título com ordem de protesto emitido")
      .add("42", "Código para baixa/devolução inválido")
      .add("46", "Tipo/número de inscrição do sacado inválidos")
      .add("48", "Cep Inválido")
      .add("53", "Tipo/Número de inscrição do sacador/avalista inválidos")
      .add("54", "Sacador/avalista não informado")
      .add("57", "Código da multa inválido")
      .add("58", "Data da multa inválida")
      .add("60", "Movimento para Título não cadastrado")
      .add("79", "Data de Juros de mora Inválida")
      .add("80", "Data do desconto inválida")
      .add("85", "Título com Pagamento Vinculado.")
      .add("88", "E-mail Sacado não lido no prazo 5 dias")
      .add("91", "E-mail sacado não recebido")
      .put()

      .codigo(32, "Instrução Rejeitada")
      .motivosAt(318, 328)
      .add("01", "Código do Banco inválido")
      .add("02", "Código do registro detalhe inválido")
      .add("04", "Código de ocorrência não permitido para a carteira")
      .add("05", "Código de ocorrência não numérico")
      .add("07", "Agência/Conta/dígito inválidos")
      .add("08", "Nosso número inválido")
      .add("10", "Carteira inválida")
      .add("15", "Características da cobrança incompatíveis")
      .add("16", "Data de vencimento inválida")
      .add("17", "Data de vencimento anterior a data de emissão")
      .add("18", "Vencimento fora do prazo de operação")
      .add("20", "Valor do título inválido")
      .add("21", "Espécie do Título inválida")
      .add("22", "Espécie não permitida para a carteira")
      .add("24", "Data de emissão inválida")
      .add("28", "Código de desconto via Telebradesco inválido")
      .add("29", "Valor do desconto maior/igual ao valor do Título")
      .add("30", "Desconto a conceder não confere")
      .add("31", "Concessão de desconto - Já existe desconto anterior")
      .add("33", "Valor do abatimento inválido")
      .add("34", "Valor do abatimento maior/igual ao valor do Título")
      .add("36", "Concessão abatimento - Já existe abatimento anterior")
      .add("38", "Prazo para protesto inválido")
      .add("39", "Pedido de protesto não permitido para o Título")
      .add("40", "Título com ordem de protesto emitido")
      .add("41", "Pedido cancelamento/sustação para Título sem instrução de protesto")
      .add("42", "Código para baixa/devolução inválido")
      .add("45", "Nome do Sacado não informado")
      .add("46", "Tipo/número de inscrição do Sacado inválidos")
      .add("47", "Endereço do Sacado não informado")
      .add("48", "CEP Inválido")
      .add("50", "CEP referente a um Banco correspondente")
      .add("53", "Tipo de inscrição do sacador avalista inválidos")
      .add("60", "Movimento para Título não cadastrado")
      .add("85", "Título com pagamento vinculado")
      .add("86", "Seu número inválido")
      .add("94", "Título Penhorado – Instrução Não Liberada pela Agência")
      .put()

      .codigo(33, "Confirmação Pedido Alteração Outros Dados")
      .semMotivo()

      .codigo(34, "Retirado de Cartório e Manutenção Carteira")
      .semMotivo()

      .codigo(35, "Desagendamento do débito automático")
      .motivosAt(318, 328)
      .add("81", "Tentativas esgotadas, baixado")
      .add("82", "Tentativas esgotadas, pendente")
      .add("83", "Cancelado pelo Sacado e Mantido Pendente, conforme negociação")
      .add("84", "Cancelado pelo sacado e baixado, conforme negociação")
      .put()

      .codigo(40, "Estorno de pagamento")
      // verificar motivos
      .semMotivo()

      .codigo(55, "Sustado judicial")
      // verificar motivos
      .semMotivo()

      .codigo(68, "Acerto dos dados do rateio de Crédito")
      // verificar motivos
      .semMotivo()

      .codigo(69, "Cancelamento dos dados do rateio")
      // verificar motivos
      .semMotivo()

      .build();

  @Override
  Banco getBanco() {
    return Banco.BRADESCO;
  }

  @Override
  Map<String, OcorrenciaCodigoPadrao> getCodigoMap() {
    return codigoMap;
  }

  private static class Wrapper extends BuilderWrapper {

    @Override
    OcorrenciaCodigoPadrao newInstance(int codigo, String descricao, MotivoParser motivoParser) {
      return new BradescoOcorrencia(codigo, descricao, motivoParser);
    }

  }

}